<?php

namespace app\admin\controller;

use app\common\controller\Backend;

class Wxpay extends Backend {

    public function _initialize() {
        
    }

    /**
     * 公众号支付 必须以get形式传递 out_trade_no 参数
     * 示例请看 /Application/Home/Controller/IndexController.class.php
     * 中的wexinpay_js方法
     */
    public function pay() {
        
        $amount = input('amount');
        $out_trade_no = input('out_trade_no');
        
         // 导入微信支付sdk
        Vendor('wxpay.NativePay');
        $notify = new \NativePay();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("部落社充值");
//        $input->SetAttach("test");
        $input->SetOut_trade_no($out_trade_no);
        $input->SetTotal_fee($amount);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
//        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://www.huanxcm.com/api/Callback/wx");
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id("123456789");
        $result = $notify->GetPayUrl($input);
        $pay_code_url = $result["code_url"];
        
        $this->assign('code_url',$pay_code_url);
      
        return $this->view->fetch();
    }

    
    
    
    /**
     * 获取jssdk需要用到的数据
     * @return array jssdk需要用到的数据
     */
    public function getParameters() {
        // 导入微信支付sdk
        Vendor('WxPay.WxPay');
        $wxpay = new \WxPay();

        // 获取配置项
        $config = !empty($wxpay->config) ? $wxpay->config : C('WxPayConf');
        // 如果没有get参数没有code；则重定向去获取openid；
        if (!isset($_GET['code'])) {
            // 获取订单号
            $out_trade_no = I('get.out_trade_no');
            // 返回的url
            $redirect_uri = U('WxPay/pay', '', '', true);
            $redirect_uri = urlencode($redirect_uri);
            $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $config['APPID'] . '&redirect_uri=' . $redirect_uri . '&response_type=code&scope=snsapi_base&state=' . $out_trade_no . '#wechat_redirect';
            redirect($url);
        } else {
            // 如果有code参数；则表示获取到openid
            $code = I('get.code');
            // 取出订单号
            $out_trade_no = I('get.state', 0, 'intval');
            // 组合获取prepay_id的url
            $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $config['APPID'] . '&secret=' . $config['APPSECRET'] . '&code=' . $code . '&grant_type=authorization_code';
            // curl获取prepay_id
            $result = $wxpay->curl_get_contents($url);
            $result = json_decode($result, true);
            $openid = $result['openid'];

            $orderInfo = $this->getOrderInfo($out_trade_no);
            // 订单数据  请根据订单号out_trade_no 从数据库中查出实际的body、total_fee、out_trade_no、product_id
            $order = array(
                'body' => $orderInfo['goods_title_arr'], // 商品描述（需要根据自己的业务修改）
                'total_fee' => $orderInfo['all_total_price'], // 订单金额  以(分)为单位（需要根据自己的业务修改）
                'out_trade_no' => $out_trade_no, // 订单号（需要根据自己的业务修改）
                'product_id' => '1', // 商品id（需要根据自己的业务修改）
                'trade_type' => 'JSAPI', // JSAPI公众号支付
                'openid' => $openid// 获取到的openid
            );
            // 统一下单 获取prepay_id
            $unified_order = $wxpay->unifiedOrder($order);
            // 获取当前时间戳
            $time = time();
            // 组合jssdk需要用到的数据
            $data = array(
                'appId' => $config['APPID'], //appid
                'timeStamp' => strval($time), //时间戳
                'nonceStr' => $unified_order['nonce_str'], // 随机字符串
                'package' => 'prepay_id=' . $unified_order['prepay_id'], // 预支付交易会话标识
                'signType' => 'MD5'//加密方式
            );
            // 生成签名
            $data['paySign'] = $wxpay->makeSign($data);
            return $data;
        }
    }

    protected function getOrderInfo($order_no) {
        $orderInfo = M('Order')->where(array('order_no' => $order_no))->find();
        if (empty($orderInfo)) {
            $this->error('找不到此订单');
        }
        if($orderInfo['order_type'] == 2){
            //充值没有子订单
            $orderInfo['goods_title_arr'] = '充值';
            $orderInfo['all_total_price'] = round($orderInfo['all_total_price'] * 100);
            return $orderInfo;
        }
        
        $orderSonList = M('OrderSon')->where(array('order_id' => $orderInfo['order_id']))->select();
        foreach ($orderSonList as $val) {
            $goods_ids[] = $val['goods_id'];
            $all_total_price += $val['total_price'];
        }
        $orderInfo['all_total_price'] = round($all_total_price * 100);
        if (empty($goods_ids)) {
            return FALSE;
        }
        $goodsList = M('Goods')->where(array('goods_id' => array('in', $goods_ids)))->select();
        foreach ($goodsList as $val) {
            $goods_title_arr[] = $val['goods_title'];
        }

        $orderInfo['goods_title_arr'] = implode('|', $goods_title_arr);
        return $orderInfo;
    }

    /**
     * notify_url接收页面
     */
    public function notify() {
        // ↓↓↓下面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除；↓↓↓
        // 获取xml
        $xml = file_get_contents('php://input', 'r');

        file_put_contents('1.txt', var_export($_REQUEST, true));
        //转成php数组 禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $data = json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
        file_put_contents('notify.text', var_export($data, TRUE));
        // ↑↑↑上面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除；↑↑↑
        // 导入微信支付sdk
        Vendor('WxPay.WxPay');
        $wxpay = new \WxPay();
        $result = $wxpay->notify();
        if ($result) {
            // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id
            $saveData['trade_no'] = $result['transaction_id'];
            $saveData['pay_time'] = date('Y-m-d H:i:s');
            $saveData['order_total_price'] = number_format($result['total_fee']/100,2);
            $saveData['status'] = 20;
            
            $res = M('Order')->where(array('order_no' => $result['out_trade_no']))->save($saveData);
            $orderInfo = M('Order')->where(array('order_no' => $result['out_trade_no']))->find();
            if($orderInfo['order_type'] == 2){
                //充值
                M('User')->where(array('user_id'=>$orderInfo['user_id']))->setInc('wallet_money', $orderInfo['all_total_price']);
                $wallet_money = M('User')->where(array('user_id'=>$orderInfo['user_id']))->getField('wallet_money');
                //
                $addData = array(
                    'user_id' => $orderInfo['user_id'],
                    'change_money' => $orderInfo['all_total_price'],
                    'money' => $wallet_money,
                    'trade_no' => $result['transaction_id'],
                    'order_sn' => $orderInfo['order_no'],
                    'type' => 2,
                );
                M('UserWalletLog')->add($addData);
            }
            
        }
    }

    

}
